﻿using System;
using System.IO;
using System.Net;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form_Sync : Form
    {
        public Form_Sync()
        {
            InitializeComponent();
            //txbUrl.Text = "http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe";
            txbUrl.Text = "http://k3.chunk.cn:8053/POSReport20/File/%E5%8D%9520240101_1217_1218171322608.xlsx";
        }

        private void btnDownLoad_Click(object sender, EventArgs e)
        {
            rtbState.Text = "下载中.....";
            if (txbUrl.Text == string.Empty)
            {
                MessageBox.Show("请先输入下载地址！");
                return;
            }

            DownLoadFileSync(txbUrl.Text.Trim()); // 开始下载
        }

        public void DownLoadFileSync(string url)
        {
            int BufferSize = 2048;
            byte[] BufferRead = new byte[BufferSize];
            string savepath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\download_file.xlsx";  // dotNetFx 35setup.exe
            HttpWebResponse myWebResponse = null;
            if (File.Exists(savepath))
            {
                File.Delete(savepath);
            }

            FileStream filestream = new FileStream(savepath, FileMode.OpenOrCreate);
            try
            {
                HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                if (myHttpWebRequest != null)
                {
                    myWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                    Stream responseStream = myWebResponse.GetResponseStream();
                    int readSize = responseStream.Read(BufferRead, 0, BufferSize);
                    while (readSize > 0)
                    {
                        filestream.Write(BufferRead, 0, readSize);
                        readSize = responseStream.Read(BufferRead, 0, BufferSize);
                    }
                    rtbState.Text = "文件下载完成，文件大小为: " + filestream.Length + "下载路径为：" + savepath;
                }
            }
            catch (Exception e)
            {
                rtbState.Text = "下载过程中发生异常，异常信息为:" + e.Message;
            }
            finally
            {
                myWebResponse?.Close();
                filestream?.Close();
            }
        }



        // 在以上代码中，我们首先在窗体构造函数中初始化了文件下载地址，接着在下载按钮单击事件中同步调用了下载文件的方法（即没有单独开启一个线程）。
        // 而在DownloadFileSync方法中，我们则先创建了一个HttpWebRequest类实例，该实例使用HTTP协议向Web服务器发出请求，然后调用GetResponse方法获得Web服务器返回的响应消息，
        // 接着调用HttpWebResponse的GetResponseStream方法来获得服务器响应的网络流，最后以循环方式从该网络流中读取字节数组，并把读取的字节数组写入本地文件，直到文件下载完成。

        // 单击 下载 按钮后，界面无法响应，程序处于“假死”状态。我们既不能移动窗体，也不能单击关闭和缩小按钮。而且，“下载中……”字符串也没有被显示在界面中。
    }
}
